namespace study02 {
    interface Person {
        /**
         * 名称
         */
        readonly name: string // 只读属性
        /**
         * 性别
         */
        sex: string
        /**
         * 年龄
         */
        age?: number | undefined// 可选属性
        /**
         * 爱好
         */
        love: string[]
        // 额外的属性  允许添加新的属性
        [proName: string]: string | number | undefined | string[]
    }

    const obj1: Person = {
        name: 'zhichao',
        age: 23,
        sex: 'male',
        love: ['timi', 'lo'],
        email: '123@qq.com',
        phone: 123,
        say: ['hai', '嗨']
    }

    // 使用interface 定义函数类型
    interface Ifn1 {
        (a: string, b: number): void
    }

    let fun1: Ifn1 = function () {
        return 22
    }
    console.log(fun1('12', 34));

    function fn2(): void {
        // return 22 // 不能将类型“number”分配给类型“void”
    }


    // 重命名合并

    interface IA {
        name: string
    }
    interface IA {
        sex: string
    }
    interface IA {
        age: number
    }
    interface IA {
        love: string[]
    }
    let obj2: IA = {
        name: 'zhichao',
        sex: 'male',
        age: 21,
        love: ['timi', 'lo']
    }


    // 继承
    interface IB {
        name: string
    }
    interface IC extends IB {
        age: number
    }
    let obj3: IC = {
        name: 'string',
        age: 19
    }


    interface Counter {
        re(start: number): string; // 函数
        interval: number; // 属性
        reset(): void; // 有名字的函数
    }

    function getCounter(): Counter {
        let counter: Counter = {
            interval: 312, // 初始化属性
            // 实现接口中的函数
            re: function (start: number): string {
                // 这里可以添加逻辑来返回一个字符串，例如基于 start 值
                return `Counter started at ${start}`;
            },
            // 实现接口中的有名字的函数
            reset: function (): void {
                // 这里可以添加逻辑来重置计数器
                console.log('Counter has been reset.');
            }
        };
        return counter;
    }

    // 使用 getCounter 函数创建一个 Counter 对象
    const myCounter = getCounter();
    console.log(myCounter.re(10)); // 调用函数，传入 start 值
    myCounter.reset(); // 调用重置函数
    console.log(myCounter.interval); // 312


    interface Ii {
        a: string
        b: string
        [proName: string]: string
    }
    let ii: Ii = {
        a: 'a',
        b: 'b'
    }

    for (const key in ii) {
        console.log(ii[key]);
        console.log(ii[key as keyof Ii]);
    }

    console.log(Object.entries(ii));
    for (const [key, value] of Object.entries(ii)) {
        console.log(key, value);
    }


}
